package com.ccx.demo.enums;

import org.apache.commons.codec.digest.DigestUtils;

import java.util.Objects;

/**
 * Redis key 构造， 非数据库相关的缓存操作
 *
 * @author 谢长春 2022-03-22
 */
public enum RedisKey {
    login_phone_code("登录验证码"),
    ;

    public final String comment;

    RedisKey(String comment) {
        this.comment = comment;
    }

    /**
     * 默认返回枚举名称作为key， 可以通过 @Override 方法覆盖 key 的生成规则
     *
     * @return {@link String}
     */
    public String key() {
        return this.name();
    }

    /**
     * 默认返回枚举名称作为key， 可以通过 @Override 方法覆盖 key 的生成规则
     *
     * @param key String
     * @return {@link String}
     */
    public String key(String key) {
        if (Objects.isNull(key) || Objects.equals("", key)) {
            throw new IllegalArgumentException("缓存 key 不能为空");
        }
        return String.format("%s:%s", this.name(), key);
    }

    /**
     * 默认返回枚举名称作为key， 可以通过 @Override 方法覆盖 key 的生成规则
     *
     * @param args String[]
     * @return {@link String}
     */
    public String key(String... args) {
        return String.format("%s:%s", this.name(), String.join(":", args));
    }

    /**
     * 长度大于 32 位的 key 使用 md5 缩短长度
     *
     * @param key String
     * @return {@link String}
     */
    public String keyMD5(String key) {
        if (Objects.isNull(key) || Objects.equals("", key)) {
            throw new IllegalArgumentException("缓存 key 不能为空");
        }
        return String.format("%s:%s", this.name(), DigestUtils.md5Hex(key));
    }

    /**
     * 长度大于 32 位的 key 使用 md5 缩短长度
     *
     * @param args String[]
     * @return {@link String}
     */
    public String keyMD5(String... args) {
        return String.format("%s:%s", this.name(), DigestUtils.md5Hex(String.join(":", args)));
    }

    public static void main(String[] args) {
    }
}
